package com.mzq.langchain4j_springboot.config;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentByCharacterSplitter;
import dev.langchain4j.data.document.splitter.DocumentByRegexSplitter;
import dev.langchain4j.data.document.splitter.DocumentBySentenceSplitter;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.model.ollama.OllamaEmbeddingModel;
import dev.langchain4j.model.output.Response;

import java.util.List;


public class EmbeddingModel {
    public static void main(String[] args) {
//        //向量模型
//        OllamaEmbeddingModel ollamaEmbeddingModel= OllamaEmbeddingModel.builder().modelName("nomic-embed-text:latest").build();
//        //文本向量化
//        Response<Embedding> embeddingResponse=ollamaEmbeddingModel.embed("你好，我叫马振清");
//        System.out.println(embeddingResponse.content().toString());
//        System.out.println(embeddingResponse.content().vector().length);

//        ChatLanguageModel model= OllamaChatModel
//                .builder()
//                .baseUrl("http://localhost:11434")
////                .apiKey("demo")
//                .modelName("qwen2.5")
//                .build();
//        System.out.println(model.chat("你好，我是马振清"));
//        System.out.println("-----");
//        System.out.println(model.chat("我叫什么"));

        //分割器不能解决所有问题  最好合理设置字数大小
        //文档解析器 只能解析txt文件 具体想解析文件需要参考https://docs.langchain4j.dev/category/document-loaders ApacheTikaDocumentParser 几乎可以解析所有文件
        Document document = ClassPathDocumentLoader.loadDocument("rag/terms-of-service.txt", new ApacheTikaDocumentParser());
        //无符号分割 严格控制字数分隔 会出现断句
//        DocumentByCharacterSplitter splitter = new DocumentByCharacterSplitter(
//                90,         // 每段最长字数
//                10                              // 自然语言最大重叠字数
//        );
//        //正则表达式分隔
//        DocumentByRegexSplitter splitter =new DocumentByRegexSplitter(
//                "\\n\\d+\\.", //匹配 "1.标题" 格式
//                "\n",  //保留换行符作为段落连接符
//                70,  //每个段最多500字符
//                1,   //段间重叠50字符以保持连贯性
//                new DocumentByCharacterSplitter(100,50)
//                );
        //按句子分隔
        DocumentBySentenceSplitter splitter=new DocumentBySentenceSplitter(90,20);
                List<TextSegment> segments = splitter.split(document);
        System.out.println(document.text());
        System.out.println(segments);
    }
}
